summaryrefslogtreecommitdiff
path: root/src/variable.h
blob: e1bc30c0554a91f0442fc05ee6dd520d6e197a50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifndef VARIABLE_H
#define VARIABLE_H

#include <stdint.h>

#include <bu/string.h>
#include <bu/hash.h>

class Variable
{
friend uint32_t Bu::__calcHashCode<Variable>( const Variable &k );
friend Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v );
public:
	enum Type
	{
		tNull,
		tBool,
		tInt,
		tFloat,
		tString,
		tSituation,
		tVariable,
		tList,
		tDictionary
	};

public:
	Variable();
	Variable( const Variable &src );
	Variable( Type eType );
	Variable( int64_t iValue );
	Variable( double fValue );
	Variable( bool bValue );
	Variable( const Bu::String &sValue );
	virtual ~Variable();

	static Variable newSituationName( const Bu::String &s );
	static Variable newVariableName( const Bu::String &s );

	Type getType() const { return eType; }

	bool getBool() const;
	int64_t getInt() const;
	double getFloat() const;
	Bu::String getString() const;

	Variable to( Type e ) const;

	Variable &operator=( const Variable &rhs );
	Variable &operator+=( const Variable &rhs );
	Variable &operator-=( const Variable &rhs );
	Variable &operator*=( const Variable &rhs );
	Variable &operator/=( const Variable &rhs );
	Variable operator+( const Variable &rhs ) const;
	Variable operator-( const Variable &rhs ) const;
	Variable operator*( const Variable &rhs ) const;
	Variable operator/( const Variable &rhs ) const;
	bool operator==( const Variable &rhs ) const;
	bool operator!=( const Variable &rhs ) const;
	bool operator>( const Variable &rhs ) const;
	bool operator<( const Variable &rhs ) const;
	bool operator>=( const Variable &rhs ) const;
	bool operator<=( const Variable &rhs ) const;

private:
	void initType();
	void deinitType();

private:
	Type eType;

	typedef Bu::List<Variable> VList;
	typedef Bu::Hash<Variable, Variable> VHash;

	union
	{
		int64_t iValue;
		double fValue;
		bool bValue;
		Bu::String *sValue;
		VList *lValue;
		VHash *hValue;
	};
};

namespace Bu
{
	template<> uint32_t __calcHashCode<Variable>( const Variable &k );
	template<> bool __cmpHashKeys<Variable>( const Variable &a, const Variable &b );
};

Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v );

typedef Bu::List<Variable> VariableList;
typedef Bu::Hash<Bu::String, Variable> VariableHash;

#endif